home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / lib / python2.5 / webbrowser.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-05-11  |  17.4 KB  |  672 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Interfaces for launching and remotely controlling Web browsers.'''
  5. import os
  6. import shlex
  7. import sys
  8. import stat
  9. import subprocess
  10. import time
  11. __all__ = [
  12.     'Error',
  13.     'open',
  14.     'open_new',
  15.     'open_new_tab',
  16.     'get',
  17.     'register']
  18.  
  19. class Error(Exception):
  20.     pass
  21.  
  22. _browsers = { }
  23. _tryorder = []
  24.  
  25. def register(name, klass, instance = None, update_tryorder = 1):
  26.     '''Register a browser connector and, optionally, connection.'''
  27.     _browsers[name.lower()] = [
  28.         klass,
  29.         instance]
  30.     if update_tryorder > 0:
  31.         _tryorder.append(name)
  32.     elif update_tryorder < 0:
  33.         _tryorder.insert(0, name)
  34.     
  35.  
  36.  
  37. def get(using = None):
  38.     '''Return a browser launcher instance appropriate for the environment.'''
  39.     if using is not None:
  40.         alternatives = [
  41.             using]
  42.     else:
  43.         alternatives = _tryorder
  44.     for browser in alternatives:
  45.         if '%s' in browser:
  46.             browser = shlex.split(browser)
  47.             if browser[-1] == '&':
  48.                 return BackgroundBrowser(browser[:-1])
  49.             else:
  50.                 return GenericBrowser(browser)
  51.         browser[-1] == '&'
  52.         
  53.         try:
  54.             command = _browsers[browser.lower()]
  55.         except KeyError:
  56.             command = _synthesize(browser)
  57.  
  58.         if command[1] is not None:
  59.             return command[1]
  60.             continue
  61.         if command[0] is not None:
  62.             return command[0]()
  63.             continue
  64.     
  65.     raise Error('could not locate runnable browser')
  66.  
  67.  
  68. def open(url, new = 0, autoraise = 1):
  69.     for name in _tryorder:
  70.         browser = get(name)
  71.         if browser.open(url, new, autoraise):
  72.             return True
  73.             continue
  74.     
  75.     return False
  76.  
  77.  
  78. def open_new(url):
  79.     return open(url, 1)
  80.  
  81.  
  82. def open_new_tab(url):
  83.     return open(url, 2)
  84.  
  85.  
  86. def _synthesize(browser, update_tryorder = 1):
  87.     """Attempt to synthesize a controller base on existing controllers.
  88.  
  89.     This is useful to create a controller when a user specifies a path to
  90.     an entry in the BROWSER environment variable -- we can copy a general
  91.     controller to operate using a specific installation of the desired
  92.     browser in this way.
  93.  
  94.     If we can't create a controller in this way, or if there is no
  95.     executable for the requested browser, return [None, None].
  96.  
  97.     """
  98.     cmd = browser.split()[0]
  99.     if not _iscommand(cmd):
  100.         return [
  101.             None,
  102.             None]
  103.     
  104.     name = os.path.basename(cmd)
  105.     
  106.     try:
  107.         command = _browsers[name.lower()]
  108.     except KeyError:
  109.         return [
  110.             None,
  111.             None]
  112.  
  113.     controller = command[1]
  114.     if controller and name.lower() == controller.basename:
  115.         import copy
  116.         controller = copy.copy(controller)
  117.         controller.name = browser
  118.         controller.basename = os.path.basename(browser)
  119.         register(browser, None, controller, update_tryorder)
  120.         return [
  121.             None,
  122.             controller]
  123.     
  124.     return [
  125.         None,
  126.         None]
  127.  
  128. if sys.platform[:3] == 'win':
  129.     
  130.     def _isexecutable(cmd):
  131.         cmd = cmd.lower()
  132.         if os.path.isfile(cmd) and cmd.endswith(('.exe', '.bat')):
  133.             return True
  134.         
  135.         for ext in ('.exe', '.bat'):
  136.             if os.path.isfile(cmd + ext):
  137.                 return True
  138.                 continue
  139.         
  140.         return False
  141.  
  142. else:
  143.     
  144.     def _isexecutable(cmd):
  145.         if os.path.isfile(cmd):
  146.             mode = os.stat(cmd)[stat.ST_MODE]
  147.             if mode & stat.S_IXUSR and mode & stat.S_IXGRP or mode & stat.S_IXOTH:
  148.                 return True
  149.             
  150.         
  151.         return False
  152.  
  153.  
  154. def _iscommand(cmd):
  155.     '''Return True if cmd is executable or can be found on the executable
  156.     search path.'''
  157.     if _isexecutable(cmd):
  158.         return True
  159.     
  160.     path = os.environ.get('PATH')
  161.     if not path:
  162.         return False
  163.     
  164.     for d in path.split(os.pathsep):
  165.         exe = os.path.join(d, cmd)
  166.         if _isexecutable(exe):
  167.             return True
  168.             continue
  169.     
  170.     return False
  171.  
  172.  
  173. class BaseBrowser(object):
  174.     '''Parent class for all browsers. Do not use directly.'''
  175.     args = [
  176.         '%s']
  177.     
  178.     def __init__(self, name = ''):
  179.         self.name = name
  180.         self.basename = name
  181.  
  182.     
  183.     def open(self, url, new = 0, autoraise = 1):
  184.         raise NotImplementedError
  185.  
  186.     
  187.     def open_new(self, url):
  188.         return self.open(url, 1)
  189.  
  190.     
  191.     def open_new_tab(self, url):
  192.         return self.open(url, 2)
  193.  
  194.  
  195.  
  196. class GenericBrowser(BaseBrowser):
  197.     '''Class for all browsers started with a command
  198.        and without remote functionality.'''
  199.     
  200.     def __init__(self, name):
  201.         if isinstance(name, basestring):
  202.             self.name = name
  203.         else:
  204.             self.name = name[0]
  205.             self.args = name[1:]
  206.         self.basename = os.path.basename(self.name)
  207.  
  208.     
  209.     def open(self, url, new = 0, autoraise = 1):
  210.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  211.         
  212.         try:
  213.             return not p.wait()
  214.         except OSError:
  215.             []
  216.             []
  217.             [
  218.                 self.name]
  219.             return False
  220.         except:
  221.             []
  222.  
  223.  
  224.  
  225.  
  226. class BackgroundBrowser(GenericBrowser):
  227.     '''Class for all browsers which are to be started in the
  228.        background.'''
  229.     
  230.     def open(self, url, new = 0, autoraise = 1):
  231.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  232.         
  233.         try:
  234.             if sys.platform[:3] == 'win':
  235.                 p = subprocess.Popen(cmdline)
  236.             else:
  237.                 setsid = getattr(os, 'setsid', None)
  238.                 if not setsid:
  239.                     setsid = getattr(os, 'setpgrp', None)
  240.                 
  241.                 p = subprocess.Popen(cmdline, close_fds = True, preexec_fn = setsid)
  242.             return p.poll() is None
  243.         except OSError:
  244.             []
  245.             []
  246.             [
  247.                 self.name]
  248.             return False
  249.         except:
  250.             []
  251.  
  252.  
  253.  
  254.  
  255. class UnixBrowser(BaseBrowser):
  256.     '''Parent class for all Unix browsers with remote functionality.'''
  257.     raise_opts = None
  258.     remote_args = [
  259.         '%action',
  260.         '%s']
  261.     remote_action = None
  262.     remote_action_newwin = None
  263.     remote_action_newtab = None
  264.     background = False
  265.     redirect_stdout = True
  266.     
  267.     def _invoke(self, args, remote, autoraise):
  268.         raise_opt = []
  269.         if remote and self.raise_opts:
  270.             autoraise = int(bool(autoraise))
  271.             opt = self.raise_opts[autoraise]
  272.             if opt:
  273.                 raise_opt = [
  274.                     opt]
  275.             
  276.         
  277.         cmdline = [
  278.             self.name] + raise_opt + args
  279.         if remote or self.background:
  280.             inout = file(os.devnull, 'r+')
  281.         else:
  282.             inout = None
  283.         setsid = getattr(os, 'setsid', None)
  284.         if not setsid:
  285.             setsid = getattr(os, 'setpgrp', None)
  286.         
  287.         if not self.redirect_stdout or inout:
  288.             pass
  289.         p = subprocess.Popen(cmdline, close_fds = True, stdin = inout, stdout = None, stderr = inout, preexec_fn = setsid)
  290.         if remote:
  291.             time.sleep(1)
  292.             rc = p.poll()
  293.             if rc is None:
  294.                 time.sleep(4)
  295.                 rc = p.poll()
  296.                 if rc is None:
  297.                     return True
  298.                 
  299.             
  300.             return not rc
  301.         elif self.background:
  302.             if p.poll() is None:
  303.                 return True
  304.             else:
  305.                 return False
  306.         else:
  307.             return not p.wait()
  308.  
  309.     
  310.     def open(self, url, new = 0, autoraise = 1):
  311.         if new == 0:
  312.             action = self.remote_action
  313.         elif new == 1:
  314.             action = self.remote_action_newwin
  315.         elif new == 2:
  316.             if self.remote_action_newtab is None:
  317.                 action = self.remote_action_newwin
  318.             else:
  319.                 action = self.remote_action_newtab
  320.         else:
  321.             raise Error("Bad 'new' parameter to open(); " + 'expected 0, 1, or 2, got %s' % new)
  322.         args = [ arg.replace('%s', url).replace('%action', action) for arg in self.remote_args ]
  323.         success = self._invoke(args, True, autoraise)
  324.  
  325.  
  326.  
  327. class Mozilla(UnixBrowser):
  328.     '''Launcher class for Mozilla/Netscape browsers.'''
  329.     raise_opts = [
  330.         '-noraise',
  331.         '-raise']
  332.     remote_args = [
  333.         '-remote',
  334.         'openURL(%s%action)']
  335.     remote_action = ''
  336.     remote_action_newwin = ',new-window'
  337.     remote_action_newtab = ',new-tab'
  338.     background = True
  339.  
  340. Netscape = Mozilla
  341.  
  342. class Galeon(UnixBrowser):
  343.     '''Launcher class for Galeon/Epiphany browsers.'''
  344.     raise_opts = [
  345.         '-noraise',
  346.         '']
  347.     remote_args = [
  348.         '%action',
  349.         '%s']
  350.     remote_action = '-n'
  351.     remote_action_newwin = '-w'
  352.     background = True
  353.  
  354.  
  355. class Opera(UnixBrowser):
  356.     '''Launcher class for Opera browser.'''
  357.     raise_opts = [
  358.         '',
  359.         '-raise']
  360.     remote_args = [
  361.         '-remote',
  362.         'openURL(%s%action)']
  363.     remote_action = ''
  364.     remote_action_newwin = ',new-window'
  365.     remote_action_newtab = ',new-page'
  366.     background = True
  367.  
  368.  
  369. class Elinks(UnixBrowser):
  370.     '''Launcher class for Elinks browsers.'''
  371.     remote_args = [
  372.         '-remote',
  373.         'openURL(%s%action)']
  374.     remote_action = ''
  375.     remote_action_newwin = ',new-window'
  376.     remote_action_newtab = ',new-tab'
  377.     background = False
  378.     redirect_stdout = False
  379.  
  380.  
  381. class Konqueror(BaseBrowser):
  382.     '''Controller for the KDE File Manager (kfm, or Konqueror).
  383.  
  384.     See the output of ``kfmclient --commands``
  385.     for more information on the Konqueror remote-control interface.
  386.     '''
  387.     
  388.     def open(self, url, new = 0, autoraise = 1):
  389.         if new == 2:
  390.             action = 'newTab'
  391.         else:
  392.             action = 'openURL'
  393.         devnull = file(os.devnull, 'r+')
  394.         setsid = getattr(os, 'setsid', None)
  395.         if not setsid:
  396.             setsid = getattr(os, 'setpgrp', None)
  397.         
  398.         
  399.         try:
  400.             p = subprocess.Popen([
  401.                 'kfmclient',
  402.                 action,
  403.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull)
  404.         except OSError:
  405.             pass
  406.  
  407.         p.wait()
  408.         return True
  409.         
  410.         try:
  411.             p = subprocess.Popen([
  412.                 'konqueror',
  413.                 '--silent',
  414.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  415.         except OSError:
  416.             pass
  417.  
  418.         if p.poll() is None:
  419.             return True
  420.         
  421.         
  422.         try:
  423.             p = subprocess.Popen([
  424.                 'kfm',
  425.                 '-d',
  426.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  427.         except OSError:
  428.             return False
  429.  
  430.         return p.poll() is None
  431.  
  432.  
  433.  
  434. class Grail(BaseBrowser):
  435.     
  436.     def _find_grail_rc(self):
  437.         import glob
  438.         import pwd
  439.         import socket
  440.         import tempfile
  441.         tempdir = os.path.join(tempfile.gettempdir(), '.grail-unix')
  442.         user = pwd.getpwuid(os.getuid())[0]
  443.         filename = os.path.join(tempdir, user + '-*')
  444.         maybes = glob.glob(filename)
  445.         if not maybes:
  446.             return None
  447.         
  448.         s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  449.         for fn in maybes:
  450.             
  451.             try:
  452.                 s.connect(fn)
  453.             except socket.error:
  454.                 
  455.                 try:
  456.                     os.unlink(fn)
  457.                 except IOError:
  458.                     pass
  459.                 except:
  460.                     None<EXCEPTION MATCH>IOError
  461.                 
  462.  
  463.                 None<EXCEPTION MATCH>IOError
  464.  
  465.             return s
  466.         
  467.  
  468.     
  469.     def _remote(self, action):
  470.         s = self._find_grail_rc()
  471.         if not s:
  472.             return 0
  473.         
  474.         s.send(action)
  475.         s.close()
  476.         return 1
  477.  
  478.     
  479.     def open(self, url, new = 0, autoraise = 1):
  480.         if new:
  481.             ok = self._remote('LOADNEW ' + url)
  482.         else:
  483.             ok = self._remote('LOAD ' + url)
  484.         return ok
  485.  
  486.  
  487.  
  488. def register_X_browsers():
  489.     if _iscommand('gconftool-2'):
  490.         gc = 'gconftool-2 -g /desktop/gnome/url-handlers/http/command 2>/dev/null'
  491.         out = os.popen(gc)
  492.         commd = out.read().strip()
  493.         retncode = out.close()
  494.         if retncode is None and commd:
  495.             register('gnome', None, BackgroundBrowser(commd.split()))
  496.         
  497.     
  498.     for browser in ('mozilla-firefox', 'firefox', 'mozilla-firebird', 'firebird', 'seamonkey', 'mozilla', 'netscape'):
  499.         if _iscommand(browser):
  500.             register(browser, None, Mozilla(browser))
  501.             continue
  502.     
  503.     if _iscommand('kfm'):
  504.         register('kfm', Konqueror, Konqueror('kfm'))
  505.     elif _iscommand('konqueror'):
  506.         register('konqueror', Konqueror, Konqueror('konqueror'))
  507.     
  508.     for browser in ('galeon', 'epiphany'):
  509.         if _iscommand(browser):
  510.             register(browser, None, Galeon(browser))
  511.             continue
  512.     
  513.     if _iscommand('skipstone'):
  514.         register('skipstone', None, BackgroundBrowser('skipstone'))
  515.     
  516.     if _iscommand('opera'):
  517.         register('opera', None, Opera('opera'))
  518.     
  519.     if _iscommand('mosaic'):
  520.         register('mosaic', None, BackgroundBrowser('mosaic'))
  521.     
  522.     if _iscommand('grail'):
  523.         register('grail', Grail, None)
  524.     
  525.  
  526. if os.environ.get('DISPLAY'):
  527.     register_X_browsers()
  528.  
  529. if os.environ.get('TERM'):
  530.     if _iscommand('links'):
  531.         register('links', None, GenericBrowser('links'))
  532.     
  533.     if _iscommand('elinks'):
  534.         register('elinks', None, Elinks('elinks'))
  535.     
  536.     if _iscommand('lynx'):
  537.         register('lynx', None, GenericBrowser('lynx'))
  538.     
  539.     if _iscommand('w3m'):
  540.         register('w3m', None, GenericBrowser('w3m'))
  541.     
  542.  
  543. if sys.platform[:3] == 'win':
  544.     
  545.     class WindowsDefault(BaseBrowser):
  546.         
  547.         def open(self, url, new = 0, autoraise = 1):
  548.             os.startfile(url)
  549.             return True
  550.  
  551.  
  552.     _tryorder = []
  553.     _browsers = { }
  554.     for browser in ('firefox', 'firebird', 'seamonkey', 'mozilla', 'netscape', 'opera'):
  555.         if _iscommand(browser):
  556.             register(browser, None, BackgroundBrowser(browser))
  557.             continue
  558.     
  559.     register('windows-default', WindowsDefault)
  560.  
  561.  
  562. try:
  563.     import ic
  564. except ImportError:
  565.     pass
  566.  
  567.  
  568. class InternetConfig(BaseBrowser):
  569.     
  570.     def open(self, url, new = 0, autoraise = 1):
  571.         ic.launchurl(url)
  572.         return True
  573.  
  574.  
  575. register('internet-config', InternetConfig, update_tryorder = -1)
  576. if sys.platform == 'darwin':
  577.     
  578.     class MacOSX(BaseBrowser):
  579.         '''Launcher class for Aqua browsers on Mac OS X
  580.  
  581.         Optionally specify a browser name on instantiation.  Note that this
  582.         will not work for Aqua browsers if the user has moved the application
  583.         package after installation.
  584.  
  585.         If no browser is specified, the default browser, as specified in the
  586.         Internet System Preferences panel, will be used.
  587.         '''
  588.         
  589.         def __init__(self, name):
  590.             self.name = name
  591.  
  592.         
  593.         def open(self, url, new = 0, autoraise = 1):
  594.             if not "'" not in url:
  595.                 raise AssertionError
  596.             if ':' not in url:
  597.                 url = 'file:' + url
  598.             
  599.             new = int(bool(new))
  600.             if self.name == 'default':
  601.                 script = 'open location "%s"' % url.replace('"', '%22')
  602.             elif self.name == 'OmniWeb':
  603.                 toWindow = ''
  604.             else:
  605.                 toWindow = 'toWindow %d' % (new - 1)
  606.             cmd = 'OpenURL "%s"' % url.replace('"', '%22')
  607.             script = 'tell application "%s"\n                                activate\n                                %s %s\n                            end tell' % (self.name, cmd, toWindow)
  608.             osapipe = os.popen('osascript', 'w')
  609.             if osapipe is None:
  610.                 return False
  611.             
  612.             osapipe.write(script)
  613.             rc = osapipe.close()
  614.             return not rc
  615.  
  616.  
  617.     register('MacOSX', None, MacOSX('default'), -1)
  618.  
  619. if sys.platform[:3] == 'os2' and _iscommand('netscape'):
  620.     _tryorder = []
  621.     _browsers = { }
  622.     register('os2netscape', None, GenericBrowser([
  623.         'start',
  624.         'netscape',
  625.         '%s']), -1)
  626.  
  627. if 'BROWSER' in os.environ:
  628.     _userchoices = os.environ['BROWSER'].split(os.pathsep)
  629.     _userchoices.reverse()
  630.     for cmdline in _userchoices:
  631.         if cmdline != '':
  632.             _synthesize(cmdline, -1)
  633.             continue
  634.     
  635.     cmdline = None
  636.     del cmdline
  637.     del _userchoices
  638.  
  639.  
  640. def main():
  641.     import getopt
  642.     usage = 'Usage: %s [-n | -t] url\n    -n: open new window\n    -t: open new tab' % sys.argv[0]
  643.     
  644.     try:
  645.         (opts, args) = getopt.getopt(sys.argv[1:], 'ntd')
  646.     except getopt.error:
  647.         msg = None
  648.         print >>sys.stderr, msg
  649.         print >>sys.stderr, usage
  650.         sys.exit(1)
  651.  
  652.     new_win = 0
  653.     for o, a in opts:
  654.         if o == '-n':
  655.             new_win = 1
  656.             continue
  657.         if o == '-t':
  658.             new_win = 2
  659.             continue
  660.     
  661.     if len(args) != 1:
  662.         print >>sys.stderr, usage
  663.         sys.exit(1)
  664.     
  665.     url = args[0]
  666.     open(url, new_win)
  667.     print '\x07'
  668.  
  669. if __name__ == '__main__':
  670.     main()
  671.  
  672.